package 多无人机架次;

import GA_Test.GAData;

import java.util.ArrayList;
import java.util.List;

public class PrintRoute {
    //我现在应该让每一个打印方法返回的是 ArrayList[Integer] 类型的链表
    public static void printRoute(ArrayList<Integer> RT, ArrayList<Integer> RU, ArrayList<Object> d_trip,Object[] ob,ArrayList<Object> Truck_hub,ArrayList<Object> Drone_hub) {

        ArrayList<Integer> truck_time = new ArrayList<>();  //这个trucktime 其实就是 每一个车辆的访问路径
        ArrayList<Integer> drone_time = new ArrayList<>();
        if(d_trip.size() == 0 && RU.size()!=0){//此时说明无人机在之间的路径生成过程中 没有一次超过约束  因此 就把当前 RU中最后一个点赋给 RT  打出来就好
            if(RU.size()==1){
                RU.clear();  // 这里注意 在将 RU中最后一个点加入RT时  一定要判断  是不是只有一个点 如果只有一个点那么就不用管
            }else if(RU.size()==2){
                RT.add(RU.get(RU.size()-1));
                RU.clear();
            }else if(RU.size()>2){
                RT.add(RU.get(RU.size()-1));
            }

            for (Integer in : RT) {
                truck_time.add(in);
            }
            for(Integer in : RU){
                drone_time.add(in);
            }
            Truck_hub.add(truck_time);
            Drone_hub.add(drone_time);
        }else {
            for (Integer in : RT) {
                truck_time.add(in);
            }
            for (int k = 0; k < d_trip.size(); k++) {
                ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                if (al.size() != 0) {
                    for (Integer inn : al) {
                        drone_time.add(inn);
                    }
                } else {
                    break;
                }
            }

            Truck_hub.add(truck_time);
            Drone_hub.add(drone_time);
        }
    }

    public static void printRoute_w0(ArrayList<Integer> RT, ArrayList<Integer> RU, ArrayList<Integer> w, ArrayList<Object> d_trip,Object[] ob,ArrayList<Object> Truck_hub,ArrayList<Object> Drone_hub) {
        ArrayList<Integer> truck_time = new ArrayList<>();
        ArrayList<Integer> drone_time = new ArrayList<>();
        if(d_trip.size() == 0&& RU.size()!=0){//此时说明无人机在之间的路径生成过程中 没有一次超过约束  因此 就把当前 RU中最后一个点赋给 RT  打出来就好
            if(RU.size()==1){
                RU.clear();  // 这里注意 在将 RU中最后一个点加入RT时  一定要判断  是不是只有一个点 如果只有一个点那么就不用管
            }else if(RU.size()==2){
                RT.add(RU.get(RU.size()-1));
                RU.clear();
            }else if(RU.size()>2){
                RT.add(RU.get(RU.size()-1));
            }
            for (Integer in : RT) {
                truck_time.add(in);
            }
            for(Integer in : RU){
                drone_time.add(in);
            }
            Truck_hub.add(truck_time);
            Drone_hub.add(drone_time);
        }else if(RU.size() == 1) {//如果ru里面只有一个节点，那就不用管
            for (Integer in : RT) {
                truck_time.add(in);
            }
            for (int k = 0; k < d_trip.size(); k++) {
                ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                if (al.size() != 0) {
                    // System.out.print("无人机路径为");
                    for (Integer inn : al) {
                        drone_time.add(inn);
                    }
                } else {
                    break;
                }
            }
            Truck_hub.add(truck_time);Drone_hub.add(drone_time);
        } else if (RU.size() == 2) {//如果RU有2个节点  当前架次 起飞点后面的点中找出一个最近的降落点 看是否满足距离约束 如果满足就将该点设为降落点 不满足则将当前无人机路径中的最后一个点加入车辆
            List<Integer> l = RT.subList(RT.indexOf(RU.get(0))+1,RT.size());
            ArrayList<Integer> after_off_point = new ArrayList<>();
            for(int h = 0;h<l.size();h++){
                after_off_point.add(l.get(h));
            }

            Integer add_point = Distance.wDistance1(RU.get(RU.size()-1),  after_off_point);//先找一个待加入的点
            RU.add(add_point);
            double drone_fly = 0; //当前无人机路径里的续航
            for(int i = 0;i<RU.size()-1;i++){
                drone_fly += GAData.disCollection[i][i+1];
            }
            if(drone_fly<= GAData.distanceDrone){//如果当前的无人机路径满足约束

                for (Integer in : RT) { //车辆访问路径输出
                    truck_time.add(in);
                }
                for (int k = 0; k < d_trip.size(); k++) { //无人机访问路径输出
                    ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                    if (al.size() != 0) {
                        for (Integer inn : al) {
                            drone_time.add(inn);
                        }
                    } else {
                        break;
                    }
                }
                for(int i =0;i<RU.size();i++){  //这里需要把 无人机访问路径里的点加到drone_time中
                    drone_time.add(RU.get(i));
                }
                Truck_hub.add(truck_time);Drone_hub.add(drone_time);
            }else{//如果无人机当前路径不满足约束的话
                RU.remove(add_point);
                if(RU.size()==1){
                    RU.clear();  // 这里注意 在将 RU中最后一个点加入RT时  一定要判断  是不是只有一个点 如果只有一个点那么就不用管
                }else if(RU.size()==2){
                    RT.add(RU.get(RU.size()-1));
                    RU.clear();
                }else if(RU.size()>2){
                    RT.add(RU.get(RU.size()-1));
                }
                for (Integer in : RT) { //车辆访问路径输出
                    truck_time.add(in);
                }
                for (int k = 0; k < d_trip.size(); k++) { //无人机访问路径输出
                    ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                    if (al.size() != 0) {
                        for (Integer inn : al) {
                            drone_time.add(inn);
                        }
                    } else {
                        break;
                    }
                }
                for(int i =0;i<RU.size();i++){  //这里需要把 无人机访问路径里的点加到drone_time中
                    drone_time.add(RU.get(i));
                }
                Truck_hub.add(truck_time);Drone_hub.add(drone_time);
            }

        }else if(RU.size()>2){ //如果出现这种情况 那就看无人机路径
            List<Integer> l = RT.subList(RT.indexOf(RU.get(0))+1,RT.size());
            ArrayList<Integer> after_off_point = new ArrayList<>();
            for(int h = 0;h<l.size();h++){
                after_off_point.add(l.get(h));
            }
            Integer add_point = Distance.wDistance1(RU.get(RU.size()-1),after_off_point);
            //判断当前无人机的续航是否满足其续航要求
            RU.add(add_point);
            double drone_fly = 0; //当前无人机路径里的续航
            for(int i = 0;i<RU.size()-1;i++){
                drone_fly += GAData.disCollection[i][i+1];
            }
            if(drone_fly<= GAData.distanceDrone){//如果当前的无人机路径满足约束

                for (Integer in : RT) { //车辆访问路径输出
                    truck_time.add(in);
                }
                for (int k = 0; k < d_trip.size(); k++) { //无人机访问路径输出
                    ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                    if (al.size() != 0) {
                        for (Integer inn : al) {
                            drone_time.add(inn);
                        }
                    } else {
                        break;
                    }
                }
                for(Integer in : RU){
                    drone_time.add(in);
                }
                Truck_hub.add(truck_time);Drone_hub.add(drone_time);
            }else{//如果无人机当前路径不满足约束的话
                RU.remove(add_point);
                if(RU.size()==1){
                    RU.clear();  // 这里注意 在将 RU中最后一个点加入RT时  一定要判断  是不是只有一个点 如果只有一个点那么就不用管
                }else if(RU.size()==2){
                    RT.add(RU.get(RU.size()-1));
                    RU.clear();
                }else if(RU.size()>2){
                    RT.add(RU.get(RU.size()-1));
                }
                for (Integer in : RT) { //车辆访问路径输出
                    truck_time.add(in);
                }
                for (int k = 0; k < d_trip.size(); k++) { //无人机访问路径输出
                    ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                    if (al.size() != 0) {
                        for (Integer inn : al) {
                            drone_time.add(inn);
                        }
                    } else {
                        break;
                    }
                }
                for(Integer in : RU){
                    drone_time.add(in);
                }
                Truck_hub.add(truck_time);Drone_hub.add(drone_time);
            }
        }else if(RU.size() == 0){
            for (Integer in : RT) { //车辆访问路径输出
                truck_time.add(in);
            }
            for (int k = 0; k < d_trip.size(); k++) { //无人机访问路径输出
                ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                if (al.size() != 0) {
                    for (Integer inn : al) {
                        drone_time.add(inn);
                    }
                } else {
                    break;
                }
            }
            Truck_hub.add(truck_time);Drone_hub.add(drone_time);
        }
    }



    public static void printRoute_w1(ArrayList<Integer> RT, ArrayList<Integer> RU, ArrayList<Integer> w, ArrayList<Object> d_trip,Object[] ob,ArrayList<Object> Truck_hub,ArrayList<Object> Drone_hub) {

        ArrayList<Integer> truck_time = new ArrayList<>();
        ArrayList<Integer> drone_time = new ArrayList<>();
        if(d_trip.size() == 0 && RU.size()!=0){//此时说明无人机在之间的路径生成过程中 没有一次超过约束  因此 就把当前 RU中最后一个点赋给 RT  打出来就好
            if(RU.size()==1){
                RU.clear();  // 这里注意 在将 RU中最后一个点加入RT时  一定要判断  是不是只有一个点 如果只有一个点那么就不用管
            }else if(RU.size()==2){
                RT.add(RU.get(RU.size()-1));
                RU.clear();
            }else if(RU.size()>2){
                RT.add(RU.get(RU.size()-1));
            }
            for (Integer in : RT) {
                truck_time.add(in);
            }
            truck_time.add(w.get(0));
            for(Integer in : RU){
                drone_time.add(in);
            }
            Truck_hub.add(truck_time);
            Drone_hub.add(drone_time);
        }else if(RU.size()==0 ) {
            for (Integer in : RT) { //车辆访问路径输出
                truck_time.add(in);
            }
            truck_time.add(w.get(0));
            for (int k = 0; k < d_trip.size(); k++) { //无人机访问路径输出
                ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                if (al.size() != 0) {
                    for (Integer inn : al) {
                        drone_time.add(inn);
                    }
                } else {
                    break;
                }
            }
            Truck_hub.add(truck_time);Drone_hub.add(drone_time);
        }else {
            for (Integer in : RT) {
                truck_time.add(in);
            }
            truck_time.add(w.get(0)); //读完之后 把未访问的这个点给加到车辆路线里
            for (int k = 0; k < d_trip.size(); k++) {
                ArrayList<Integer> al = (ArrayList<Integer>) d_trip.get(k);
                if (al.size() != 0) {
                    for (Integer inn : al) {
                        drone_time.add(inn);
                    }
                } else {
                    break;
                }
            }
            Truck_hub.add(truck_time);
            Drone_hub.add(drone_time);
        }
    }
}


